
package jp.ize.ux.components;

// {{{ class UXFormData
/**
* UXFormDataクラスです。
*/
class UXFormData
{
	// {{{ properties

	public var getValuesHandler:Void->Hash<String>;
	public var values:Hash<String>;
	public var toWebFilter:Hash<String->String>;
	public var fromWebFilter:Hash<String->String>;
	public var toFormFilter:Hash<String->String>;
	public var fromFormFilter:Hash<String->String>;

	// }}}
	// {{{ public function new( ?handler:Void->Hash<String> ) : Void
	/**
	* コンストラクタ
	* handler には、値を取得するための標準の関数を設定します。
	*/
	public function new( ?handler:Void->Hash<String> ) : Void
	{
		getValuesHandler = handler;
		values = new Hash();
		toWebFilter = new Hash();
		fromWebFilter = new Hash();
		toFormFilter = new Hash();
		fromFormFilter = new Hash();
	}

	// }}}
	// {{{ public function setToWebFilter( key:String, filter:String->String ) : Void
	/**
	* WEBサーバに送信するときの変換ルールを設定します。
	*/
	public function setToWebFilter( key:String, filter:String->String ) : Void
	{
		toWebFilter.set(key,filter);
	}

	// }}}
	// {{{ public function setFromWebFilter( key:String, filter:String->String ) : Void
	/**
	* WEBサーバから受信するときの変換ルールを設定します。
	*/
	public function setFromWebFilter( key:String, filter:String->String ) : Void
	{
		fromWebFilter.set(key,filter);
	}

	// }}}
	// {{{ public function setToFormFilter( key:String, filter:String->String ) : Void
	/**
	* 別のフォームに送信するときの変換ルールを設定します。
	*/
	public function setToFormFilter( key:String, filter:String->String ) : Void
	{
		toFormFilter.set(key,filter);
	}

	// }}}
	// {{{ public function setFromFormFilter( key:String, filter:String->String ) : Void
	/**
	* 別のフォームから受信するときの変換ルールを設定します。
	*/
	public function setFromFormFilter( key:String, filter:String->String ) : Void
	{
		fromFormFilter.set(key,filter);
	}

	// }}}
	// {{{ public function getValues() : Void
	/**
	* 値を内部のvaluesに対して取得します。取得には、コンストラクタで指定したhandlerを使います。
	*/
	public function getValues() : Void
	{
		values = getValuesHandler();
	}

	// }}}
	// {{{ public function getValue( key:String ) : String
	/**
	* keyを指定して、valuesから値を外部に取得します。
	*/
	public function getValue( key:String ) : String
	{
		if ( values.exists(key) ) {
			return values.get(key);
		} else {
			return null;
		}
	}

	// }}}
	// {{{ public function setValue( key:String, val:String ) : Void
	/**
	* keyを指定して、内部のvaluesに値を設定します。
	*/
	public function setValue( key:String, val:String ) : Void
	{
		values.set(key,val);
	}

	// }}}
	// {{{ public function setDataFromForm( d:Hash<String> ) : Void
	/**
	* 別のフォームからデータを取得した場合に値の変換ルールをfromFormFilterを使って変換し、内部のvaluesに値を設定します。
	*/
	public function setDataFromForm( d:Hash<String> ) : Void
	{
		for ( key in d.keys() ) {
			if ( fromFormFilter.exists(key) ) {
				var filter = fromFormFilter.get(key);
				values.set(key,filter(d.get(key)));
			} else {
				values.set(key,d.get(key));
			}
		}
	}

	// }}}
	// {{{ public function getDataToForm() : Hash<String>
	/**
	* 別のフォームに対してデータを取得したい場合に値の変換ルールをtoFormFilterを使って変換し、内部のvaluesの値を取得します。
	*/
	public function getDataToForm() : Hash<String>
	{
		var ret:Hash<String> = new Hash();
		for ( key in values.keys() ) {
			if ( toFormFilter.exists(key) ) {
				var filter = toFormFilter.get(key);
				ret.set(key,filter(values.get(key)));
			} else {
				ret.set(key,values.get(key));
			}
		}
		return ret;
	}

	// }}}
	// {{{ public function setDataFromWeb( d:Hash<String> ) : Void
	/**
	* WEBサーバからデータを取得した場合に値の変換ルールをfromWebFilterを使って変換し、内部のvaluesに値を設定します。
	*/
	public function setDataFromWeb( d:Hash<String> ) : Void
	{
		for ( key in d.keys() ) {
			if ( fromWebFilter.exists(key) ) {
				var filter = fromWebFilter.get(key);
				values.set(key,filter(d.get(key)));
			} else {
				values.set(key,d.get(key));
			}
		}
	}

	// }}}
	// {{{ public function getDataToWeb() : Hash<String>
	/**
	* WEBサーバに対してデータを送信するために値を取得したい場合に値の変換ルールをtoWebFilterを使って変換し、内部のvaluesの値を取得します。
	*/
	public function getDataToWeb() : Hash<String>
	{
		var ret:Hash<String> = new Hash();
		for ( key in values.keys() ) {
			if ( toWebFilter.exists(key) ) {
				var filter = toWebFilter.get(key);
				ret.set(key,filter(values.get(key)));
			} else {
				ret.set(key,values.get(key));
			}
		}
		return ret;
	}

	// }}}
}
// }}}
